# -*- coding: utf-8 -*- 
# @project : 《Atcoder》
# @Author : created by bensonrachel on 2021/9/4
# @File : I题.py

from collections import deque
import sys
MAX_INT = sys.maxsize#最大整数

"""
Given an array of n integers ai. Let's say that a segment of this array a[l..r] is good if on this segment it is possible to choose a certain set of numbers whose sum is equal to s. 
Your task is to find the shortest good segment.
"""


class stk:#专门写一个类来做
    """
    基于子集和问题的设计的一个栈类
    一个stk里有两个栈（que栈和dp栈），他们都是使用python的双端队列来实现。
    dp栈的存的元素类型为列表。
    """
    def __init__(self, s):
        """
        Initialize your data structure here.
        """
        self.que = deque()
        self.dp = deque()
        self.dp.append([1] + [0] * (s))#Cooking一维数组的初始化
        self.s = s

    def push(self, x: int) -> None:
        """
        压栈.
        """
        self.que.append(x)
        """
        取dp栈顶用来更新新的需要入栈的一维数组
        """
        temp = self.dp[-1]
        copy_temp = [0]*(self.s+1)#注意每次都要新开一个copy_temp，不能直接在temp上面修改，浅拷贝的问题，深拷贝又不行（太浪费时间）
        for j in range(self.s, -1, -1):
            if(j>=x):
                copy_temp[j] = temp[j] or temp[j - x]
            else:
                copy_temp[j] = temp[j]
        #这一部分参照Cooking的一维数组做法的部分
        self.dp.append(copy_temp)


    def pop(self) -> None:
        """
        Removes the element from in front of queue and returns that element.
        出栈就是直接同时把que、dp两个栈都出栈即可
        """
        tmp = self.que.pop()
        tmp2 = self.dp.pop()

    def peek(self) -> int:
        """
        返回que栈栈顶元素
        """
        return self.que[-1]

    def empty(self) -> bool:
        """
        Returns whether the queue is empty.
        """
        return not self.que

    def get(self) -> deque:
        """
        返回dp栈栈顶元素
        """
        return self.dp[-1]


def query(s1, s2):
    dp1 = s1.get()
    dp2 = s2.get()
    for i in range(s + 1):
        if (dp1[i] and dp2[s - i]):#两个栈有加起来的s的就是说明这一个区间是good的
            return True
    return False


def remove(s1, s2):#移除元素，只能从S1中移除
    if (s1.empty()):#当s1为空时，把s2的元素全部搬到s1中
        while (not s2.empty()):
            s1.push(s2.peek())
            s2.pop()
    s1.pop()


def TPM():
    s1 = stk(s)#出元素
    s2 = stk(s)#进元素
    l = 0
    res = MAX_INT
    for r in range(n):
        s2.push(a[r])
        while (l <= r and query(s1, s2)):#这里l <= r 可以不用，没元素的话肯定不能组成s
            res = min(res, r - l + 1)
            remove(s1, s2)
            l += 1
    if (res > n):
        res = -1
    return res

"""
单调栈里面再套D题Cooking的子集和问题

C++里用01串来做，但是这里python的bin（）函数的时间复杂度太高，过不了一直TLE
因此另辟蹊径，改用Cooking里一维数组的方式。

单调栈详细解释看注释里。重新注意python列表中的浅拷贝的问题，深拷贝又是一种很高复杂度的操作。
"""

if __name__ == '__main__':
    n, s = map(int, input().split())
    a = [int(i) for i in input().split()]
    ans = TPM()
    print(ans)

